//! 日志宏模块
//!
//! 提供便捷的日志记录宏，支持 6 个日志级别。
//!
//! ## 主要宏
//!
//! - `trace!` - 追踪级别日志
//! - `debug!` - 调试级别日志
//! - `info!` - 信息级别日志
//! - `warn!` - 警告级别日志
//! - `error!` - 错误级别日志
//! - `fatal!` - 致命级别日志（自动写入系统日志）
//!
//! ## 示例
//!
//! ```rust,ignore
//! use log4r::{trace, debug, info, warn, error, fatal};
//!
//! // 基础用法
//! info!("服务启动成功");
//!
//! // 带格式化参数
//! debug!("处理请求: id={}, method={}", req_id, method);
//!
//! // 指定 target
//! warn!(target: "my_app::db", "数据库连接池即将耗尽");
//!
//! // FATAL 级别（自动写入系统日志）
//! fatal!("致命错误: 无法连接到核心服务");
//! ```

/// 记录 TRACE 级别日志
///
/// 最详细的跟踪信息，通常用于开发调试。
///
/// # 示例
///
/// ```rust,ignore
/// log4r::trace!("进入函数");
/// log4r::trace!("变量值: x={}", x);
/// log4r::trace!(target: "my_module", "详细跟踪");
/// ```
#[macro_export]
macro_rules! trace {
    (target: $target:expr, $($arg:tt)+) => {
        tracing::trace!(target: $target, $($arg)+)
    };
    ($($arg:tt)+) => {
        tracing::trace!($($arg)+)
    };
}

/// 记录 DEBUG 级别日志
///
/// 调试信息，用于开发和问题排查。
///
/// # 示例
///
/// ```rust,ignore
/// log4r::debug!("调试信息");
/// log4r::debug!("请求参数: {:?}", params);
/// log4r::debug!(target: "my_module", "调试详情");
/// ```
#[macro_export]
macro_rules! debug {
    (target: $target:expr, $($arg:tt)+) => {
        tracing::debug!(target: $target, $($arg)+)
    };
    ($($arg:tt)+) => {
        tracing::debug!($($arg)+)
    };
}

/// 记录 INFO 级别日志
///
/// 一般信息，用于记录正常运行状态。
///
/// # 示例
///
/// ```rust,ignore
/// log4r::info!("服务启动成功");
/// log4r::info!("处理了 {} 条记录", count);
/// log4r::info!(target: "my_module", "操作完成");
/// ```
#[macro_export]
macro_rules! info {
    (target: $target:expr, $($arg:tt)+) => {
        tracing::info!(target: $target, $($arg)+)
    };
    ($($arg:tt)+) => {
        tracing::info!($($arg)+)
    };
}

/// 记录 WARN 级别日志
///
/// 警告信息，表示潜在问题但不影响正常运行。
///
/// # 示例
///
/// ```rust,ignore
/// log4r::warn!("配置项已废弃");
/// log4r::warn!("重试次数: {}", retry_count);
/// log4r::warn!(target: "my_module", "资源即将耗尽");
/// ```
#[macro_export]
macro_rules! warn {
    (target: $target:expr, $($arg:tt)+) => {
        tracing::warn!(target: $target, $($arg)+)
    };
    ($($arg:tt)+) => {
        tracing::warn!($($arg)+)
    };
}

/// 记录 ERROR 级别日志
///
/// 错误信息，表示发生了错误但程序可以继续运行。
///
/// # 示例
///
/// ```rust,ignore
/// log4r::error!("请求处理失败");
/// log4r::error!("错误: {}", err);
/// log4r::error!(target: "my_module", "数据库连接失败");
/// ```
#[macro_export]
macro_rules! error {
    (target: $target:expr, $($arg:tt)+) => {
        tracing::error!(target: $target, $($arg)+)
    };
    ($($arg:tt)+) => {
        tracing::error!($($arg)+)
    };
}

/// 记录 FATAL 级别日志
///
/// 致命错误，表示严重问题，程序可能无法继续运行。
/// **FATAL 级别日志会自动写入系统日志**（Windows Event Log / systemd journal / os_log）。
///
/// # 示例
///
/// ```rust,ignore
/// log4r::fatal!("致命错误: 核心服务不可用");
/// log4r::fatal!("系统崩溃: {}", reason);
/// log4r::fatal!(target: "my_module", "无法恢复的错误");
/// ```
///
/// # 注意
///
/// FATAL 是 log4r 独有的级别，在 tracing 中映射为 ERROR 级别，
/// 并添加 `fatal = true` 字段标记，用于触发系统日志写入。
#[macro_export]
macro_rules! fatal {
    (target: $target:expr, $($arg:tt)+) => {
        tracing::error!(target: $target, fatal = true, $($arg)+)
    };
    ($($arg:tt)+) => {
        tracing::error!(fatal = true, $($arg)+)
    };
}

#[cfg(test)]
mod tests {
    // 宏的测试在 tests/macros_test.rs 中进行
    // 这里只验证宏可以编译

    #[test]
    fn test_macros_compile() {
        // 验证所有宏都可以编译
        // 实际输出测试在集成测试中进行
        crate::trace!("trace");
        crate::debug!("debug");
        crate::info!("info");
        crate::warn!("warn");
        crate::error!("error");
        crate::fatal!("fatal");
    }

    #[test]
    fn test_macros_with_args() {
        let value = 42;
        crate::info!("value: {}", value);
        crate::info!("value: {value}");
    }

    #[test]
    fn test_macros_with_target() {
        crate::info!(target: "test_module", "targeted message");
    }
}
